package com.zjcloud.academic.service;

import com.zjcloud.academic.domain.AcCourseSchedule;
import java.util.List;

/**
 * 智能排课服务接口
 * 
 * @author zjcloud
 * @date 2024-01-01
 */
public interface IntelligentScheduleService {

    /**
     * 智能排课
     * 
     * @param semesterId 学期ID
     * @return 排课结果列表
     */
    List<AcCourseSchedule> intelligentSchedule(Long semesterId);

    /**
     * 智能排课（带进度回调）
     * 
     * @param semesterId 学期ID
     * @param progressCallback 进度回调接口
     * @return 排课结果列表
     */
    List<AcCourseSchedule> intelligentSchedule(Long semesterId, ProgressCallback progressCallback);

    /**
     * 进度回调接口
     */
    interface ProgressCallback {
        void onProgressUpdate(int progress, String message);
        void onComplete(List<AcCourseSchedule> result);
        void onError(String error);
    }

    /**
     * 检查排课冲突
     * 
     * @param schedule 排课信息
     * @return 冲突信息列表
     */
    List<String> checkScheduleConflict(AcCourseSchedule schedule);

    /**
     * 优化现有排课
     * 
     * @param semesterId 学期ID
     * @return 优化后的排课结果
     */
    List<AcCourseSchedule> optimizeSchedule(Long semesterId);

    /**
     * 优化现有排课（带操作用户）
     * 
     * @param semesterId 学期ID
     * @param operateUser 操作用户
     * @return 优化后的排课结果
     */
    String optimizeSchedule(Long semesterId, String operateUser);

    /**
     * 获取排课统计信息
     * 
     * @param semesterId 学期ID
     * @return 统计信息
     */
    ScheduleStatistics getScheduleStatistics(Long semesterId);

    /**
     * 排课统计信息类
     */
    class ScheduleStatistics {
        private int totalCourses;
        private int scheduledCourses;
        private int conflictCount;
        private double utilizationRate;

        public int getTotalCourses() {
            return totalCourses;
        }

        public void setTotalCourses(int totalCourses) {
            this.totalCourses = totalCourses;
        }

        public int getScheduledCourses() {
            return scheduledCourses;
        }

        public void setScheduledCourses(int scheduledCourses) {
            this.scheduledCourses = scheduledCourses;
        }

        public int getConflictCount() {
            return conflictCount;
        }

        public void setConflictCount(int conflictCount) {
            this.conflictCount = conflictCount;
        }

        public double getUtilizationRate() {
            return utilizationRate;
        }

        public void setUtilizationRate(double utilizationRate) {
            this.utilizationRate = utilizationRate;
        }
    }
}